#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

//重定向的本质是：上层用的fd不变，在内核中更改fd对应的struct file*的地址
//比如说现在file* df_arry[1]指向的是log.txt文件的地址
int main()
{
    //close(0);
    //close(2);
   // close(1);
    umask(0);//设置子进程的umask码，不会对父进程造成影响
    //int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
    int fd = open("log.txt",O_RDONLY);//fd的下标是在表中从上到下找空位置。
    
    if(fd < 0)
    {
        perror("open");
        return 1;
    }
   //现在想在stdin中获取数据
   char line[64];
   while(1)
   {
       printf("> ");
       //stdin:0 
       
       dup2(fd,0);//输入重定向
       if(fgets(line,sizeof(line),stdin) == NULL) break;//fgets:C语言接口，读取到末尾返回NULL
       printf("%s",line);
   }

   // dup2(fd,1);

   // //现在输出到显示器的信息，写入到了log.txt  --> 这种现象叫做重定向
   // printf("open fd:%d\n",fd);//printf --> stdout
   // fprintf(stdout,"open fd:%d\n",fd);

   // //信息再缓冲区，要主动刷新出来
   // fflush(stdout);
    close(fd);
    return 0;
}

/////////////////////////////////////////////////////////////////////////

//  >:输出 >>:追加 <:输入
//重定向更方便的接口  -> dup2();
//int dup2(int oldfd,int newfd);  最终剩下的是oldfd,现在想把 fd的内容拷贝给1，最终1(显示器地址)和fd指向的内容都是同一个。

/////////////////////////////////////////////////////////////////////////

//如何理解Linux下一切皆文件？
//各种外设的驱动中都又读和写的实现方法，每个外设或文件都又struct file{文件的所有属性+读写的声明(需要的试试调用驱动中的方法)}；
//所以在OS看来都是对struct file的管理
